package com.kgcx.push.utils;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @version 1.0
 * @description
 * @auther 杨麒麟
 * @create 2018/5/16 16:41
 */
public class FtpUtil {

    private static FtpUtil ftpUtils;
    private FTPClient ftp;
    private String host; //服务器地址
    private String port; // 服务器端口
    private String username; // 用户登录名
    private String password; // 用户登录密码

    /**
     * 私有构造方法
     */
    private FtpUtil() {
        initConfig();
        if (null == ftp) {
            ftp = new FTPClient();
        }
    }
    /**
     * 获取FTPUtils对象实例
     *
     * @return FTPUtils对象实例
     */
    public synchronized static FtpUtil getInstance() {
        if (null == ftpUtils) {
            ftpUtils = new FtpUtil();
        }
        return ftpUtils;
    }

    /**
     * 初始化FTP服务器连接属性
     */
    public void initConfig() {
        /// 构造Properties对象
        Properties properties = new Properties();
        try {
            InputStream is = FtpsUtils.class.getClassLoader().getResourceAsStream("ftpConfig.properties");
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 172.30.50.104ftp读取配置文件
        host = (String) properties.get("host"); // 设置服务器地址
        port = (String) properties.get("port"); // 设置端口
        username = (String) properties.get("userName"); // 设置用户名
        password = (String) properties.get("password"); // 设置密码
    }

    /**
     * Description: 向FTP服务器上传文件
     *
     * @param host
     *            FTP服务器hostname
     * @param port
     *            FTP服务器端口
     * @param username
     *            FTP登录账号
     * @param password
     *            FTP登录密码
     * @param basePath
     *            FTP服务器基础目录
     * @param filePath
     *            FTP服务器文件存放路径。例如分日期存放：/2015/01/01。文件的路径为basePath+filePath
     * @param filename
     *            上传到FTP服务器上的文件名
     * @param input
     *            输入流
     * @return 成功返回true，否则返回false
     */
    public boolean uploadFile(String basePath,
            String filePath, String filename, InputStream input) {
        boolean result = false;
        try {
            int reply;
            ftp.connect(host, Integer.parseInt(port));// 连接FTP服务器
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            // 切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath + filePath)) {
                // 如果目录不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir))
                        continue;
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            // 设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();
            boolean b = ftp.storeFile(filename, input);
            // 上传文件
            if (!b) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }
}
